| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 | Shader "FlatKit/Demos/Circle Decal"{    Properties    {        [MainColor][HDR]_Color("_Color (default = 1,1,1,1)", Color) = (1,1,1,1)        [Space]        [Enum(UnityEngine.Rendering.BlendMode)]_DecalSrcBlend("Src Blend", Int) = 5 // 5 = SrcAlpha        [Enum(UnityEngine.Rendering.BlendMode)]_DecalDstBlend("Dst Blend", Int) = 10 // 10 = OneMinusSrcAlpha        [Space]        [Toggle(_ProjectionAngleDiscardEnable)] _ProjectionAngleDiscardEnable("Angle Discard Enable", float) = 0        _ProjectionAngleDiscardThreshold("     Threshold", range(-1,1)) = 0        [Space]        _StencilRef("Stencil Reference", Float) = 0        [Enum(UnityEngine.Rendering.CompareFunction)]_StencilComp("Stencil Compare", Float) = 0 //0 = disable        [Space]        [Enum(UnityEngine.Rendering.CompareFunction)]_ZTest("Depth Test", Float) = 0 //0 = disable        [Space]        [Enum(UnityEngine.Rendering.CullMode)]_Cull("Cull", Float) = 1 //1 = Front    }    SubShader    {        Tags        {            "RenderType" = "Overlay" "Queue" = "Transparent-499" "DisableBatching" = "True"        }        Pass        {            Stencil            {                Ref[_StencilRef]                Comp[_StencilComp]            }            Cull[_Cull]            ZTest[_ZTest]            ZWrite off            Blend[_DecalSrcBlend][_DecalDstBlend]            HLSLPROGRAM            #pragma vertex vert            #pragma fragment frag            // make fog work            #pragma multi_compile_fog            // due to using ddx() & ddy()            #pragma target 3.0            #pragma shader_feature_local_fragment _ProjectionAngleDiscardEnable            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"            struct appdata {                float3 positionOS : POSITION;            };            struct v2f {                float4 positionCS : SV_POSITION;                float4 screenPos : TEXCOORD0;                float4 viewRayOS : TEXCOORD1; // xyz: viewRayOS, w: extra copy of positionVS.z                 float4 cameraPosOSAndFogFactor : TEXCOORD2;            };            sampler2D _MainTex;            sampler2D _CameraDepthTexture;            CBUFFER_START(UnityPerMaterial)            float4 _MainTex_ST;            float _ProjectionAngleDiscardThreshold;            half4 _Color;            half2 _AlphaRemap;            half _MulAlphaToRGB;            CBUFFER_END            v2f vert(appdata input) {                v2f o;                VertexPositionInputs vertexPositionInput = GetVertexPositionInputs(input.positionOS);                o.positionCS = vertexPositionInput.positionCS;                #if _UnityFogEnable                o.cameraPosOSAndFogFactor.a = ComputeFogFactor(o.positionCS.z);                #else                o.cameraPosOSAndFogFactor.a = 0;                #endif                o.screenPos = ComputeScreenPos(o.positionCS);                float3 viewRay = vertexPositionInput.positionVS;                o.viewRayOS.w = viewRay.z;                viewRay *= -1;                float4x4 ViewToObjectMatrix = mul(UNITY_MATRIX_I_M, UNITY_MATRIX_I_V);                o.viewRayOS.xyz = mul((float3x3)ViewToObjectMatrix, viewRay);                o.cameraPosOSAndFogFactor.xyz = mul(ViewToObjectMatrix, float4(0, 0, 0, 1)).xyz;                return o;            }            // copied from URP12.1.2's ShaderVariablesFunctions.hlsl            #if SHADER_LIBRARY_VERSION_MAJOR < 12            float LinearDepthToEyeDepth(float rawDepth)            {            #if UNITY_REVERSED_Z                    return _ProjectionParams.z - (_ProjectionParams.z - _ProjectionParams.y) * rawDepth;            #else                    return _ProjectionParams.y + (_ProjectionParams.z - _ProjectionParams.y) * rawDepth;            #endif            }            #endif            half4 frag(v2f i) : SV_Target {                i.viewRayOS.xyz /= i.viewRayOS.w;                float2 screenSpaceUV = i.screenPos.xy / i.screenPos.w;                float sceneRawDepth = tex2D(_CameraDepthTexture, screenSpaceUV).r;                float3 decalSpaceScenePos;                if (unity_OrthoParams.w) {                    float sceneDepthVS = LinearDepthToEyeDepth(sceneRawDepth);                    float2 viewRayEndPosVS_xy = float2(                        unity_OrthoParams.xy * (i.screenPos.xy - 0.5) * 2 /* to clip space */);                    float4 vposOrtho = float4(viewRayEndPosVS_xy, -sceneDepthVS, 1); // view space pos                    float3 wposOrtho = mul(UNITY_MATRIX_I_V, vposOrtho).xyz; // view space to world space                    decalSpaceScenePos = mul(GetWorldToObjectMatrix(), float4(wposOrtho, 1)).xyz;                } else {                    float sceneDepthVS = LinearEyeDepth(sceneRawDepth, _ZBufferParams);                    decalSpaceScenePos = i.cameraPosOSAndFogFactor.xyz + i.viewRayOS.xyz * sceneDepthVS;                }                float2 decalSpaceUV = decalSpaceScenePos.xy + 0.5;                float shouldClip = 0;                #if _ProjectionAngleDiscardEnable                float3 decalSpaceHardNormal = normalize(cross(ddx(decalSpaceScenePos), ddy(decalSpaceScenePos)));                shouldClip = decalSpaceHardNormal.z > _ProjectionAngleDiscardThreshold ? 0 : 1;                #endif                clip(0.5 - abs(decalSpaceScenePos) - shouldClip);                float4 col = 1;                col.a = smoothstep(0, 0.01, 1 - length(decalSpaceUV - 0.5) * 2);                col *= _Color;                col.rgb = MixFog(col.rgb, i.cameraPosOSAndFogFactor.a);                return col;            }            ENDHLSL        }    }}
 |